#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,c,fa[N],col[N],cnt[N],ans[N];
struct Dsu{
	int fa[N],siz[N];
	void init(int n){
		for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
	}
	int find(int x){
		if(x==fa[x]) return x;
		return fa[x]=find(fa[x]);
	}
	void merge(int x,int y){
		if(find(x)==find(y)) return ;
		siz[find(y)]+=siz[find(x)];
		fa[find(x)]=find(y);
	}
	int qry(int x){
		return siz[find(x)];
	}
} dsu;
vector<pair<int,int>> qs[1<<15];
int main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>q>>c;
	for(int i=1;i<=n;i++){
		cin>>col[i];
		cnt[col[i]]++;
	}
	for(int i=2;i<=n;i++) cin>>fa[i];
	for(int i=1;i<=q;i++){
		int s,u;cin>>s>>u;
		qs[s].push_back(make_pair(u,i));
	}
	for(int s=0;s<(1<<c);s++){
		dsu.init(n);
		for(int i=2;i<=n;i++){
			if(((s>>col[i])&1) && ((s>>col[fa[i]])&1)){
				dsu.merge(i,fa[i]);
			}
		}
		for(auto q:qs[s]){
			int u=q.first,id=q.second;
			ans[id]=dsu.qry(u);
		}
	}
	for(int i=1;i<=q;i++){
		cout<<ans[i]<<"\n";
	}
}
